<?php

namespace app\modules\admin\models;

use Yii;
use yii\web\IdentityInterface;
/**
 * 实现整个框架的登录用户管理的类
 * @
 */
class AdminUserEntity implements IdentityInterface
{
    public $AccountId='';//数据库主键编号
    public $LoginName='';//登录名
    public $NickName='';//显示昵称
    public $AuthKey='';//验证key
    public $Token='';//会话令牌
    /**
     * 重载的方法，根据id获取用户实例，自动登录时会调用
     * @
     */
    public static function findIdentity($id)
    {
        //此处需要根据id查询数据库，客户端缓存了userPkId,id=配置值时时则是系统默认管理用户
        $user=new AdminUserEntity();
        if($id==Yii::$app->params['SupperId']) {
            $user->AccountId=Yii::$app->params['SupperId'];
            $user->LoginName=Yii::$app->params['SupperUser'];
            $user->NickName='SupperMan';
            $user->AuthKey=$user->AccountId;
            $user->Token=$user->AccountId;
        }
        else
        {
            if(isset($id)) {
                //查询数据库返回用户对象实例，填充$user
                $user->dbLoadAccountById($id);
            }
        }
        return $user;
    }

    /**
     * 重载的方法，根据token获取用户实例
     * @
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        $user=null;
        if($token==Yii::$app->params['SupperId'])
            $user=static::findIdentity($token);
        else
        {
            //根据token查询数据库返回用户对象实例,该token应该在用户登录时写入数据库
        }
        return $user;
    }

    /**
     * 重载的方法，获取Id
     * @
     */
    public function getId()
    {
        return $this->AccountId;
    }

    /**
     * 重载的方法,获取用户名
     *@
     */

    public  function  getUser(){
        return $this->NickName;
    }

    /**
     * 重载的方法，获取ActhKey
     * @
     */
    public function getAuthKey()
    {
        return $this->AuthKey;
    }

    /**
     * 重载的方法，验证key
     * @
     */
    public function validateAuthKey($authKey)
    {
        return $this->AuthKey === $authKey;//严格来说应该去数据库验证Key是否修改过
    }

    /**
     * 重载的方法，验证密码
     * @
     */
    public function validatePassword($password)
    {
        $isTrue=false;
        if($this->AccountId==Yii::$app->params['SupperId'])
        {
            $isTrue=true;
        }
        else {
            //此处应该根据$this.AccountID去数据库查询密码
        }
        return $isTrue;
    }
    //初始化权限系统
    public static function initPermission()
    {
        $auth = Yii::$app->authManager;
        if(null === $auth->getRole('Supper')) {
            //初始化权限，这些代码会生成rbac下的相关文件，只需要执行一次。

            $perm1 = $auth->createPermission('view');
            $perm1->description = '查看';
            $auth->add($perm1);

            $perm2 = $auth->createPermission('edit');
            $perm2->description = '编辑';
            $auth->add($perm2);

            $perm3 = $auth->createPermission('manage');
            $perm3->description = '所有';
            $auth->add($perm3);

            //子账户角色
            $role1 = $auth->createRole('Child');
            $auth->add($role1);
            $auth->addChild($role1, $perm1);

            //父账户角色
            $role2 = $auth->createRole('Father');
            $auth->add($role2);
            $auth->addChild($role2, $perm1);
            $auth->addChild($role2, $perm2);

            //超户角色
            $role3 = $auth->createRole('Supper');
            $auth->add($role3);
            $auth->addChild($role3, $perm1);
            $auth->addChild($role3, $perm2);
            $auth->addChild($role3, $perm3);
        }


    }
    public function dbLoadAccountById($id)
    {
        //从数据库查询id填充this对象并返回炒作结果
        $result=false;
        return $result;
    }
    private function dbLoadAccountByPassword($login,$password)
    {
        //从数据库查询账户密码匹配的用户，填充this对象,返回成功失败
        $result=false;
        return $result;
    }
    //对外提供的登录接口，返回成功失败
    public  static function ExecuteLogin($login,$password,$ip)
    {
        $user=false;
        static::initPermission();
        $auth = Yii::$app->authManager;
        if($login==Yii::$app->params['SupperUser']&&$password==Yii::$app->params['SupperPassword']) {
            $user=static::findIdentity(Yii::$app->params['SupperId']);
            // 赋予超户权限
            $auth->revokeAll($user->getId());
            $authorRole = $auth->getRole('Supper');//分别有Child、Father、Supper三类角色
            $auth->assign($authorRole, $user->getId());
            $result=true;
        }
        else {
            $user=new AdminUserEntity();
            if(!$user->dbLoadAccountByPassword($login,$password,$ip)) {
                $user=false;
            }
            else
            {
                // 根据返回数据赋予对应Father或Child权限
                $authorRole = $auth->getRole('Child');//分别有Child、Father、Supper三类角色
                $auth->revokeAll($user->getId());
                $auth->assign($authorRole, $user->getId());
            }
        }
        if(!$user===false) {
            //需执行，插入新的token，插入登录历史的记录,需要提供一个方法
            //Yii::$app->security->generateRandomString();这个方法用来生成加密的随机字符串，可用于token和authKey
            Yii::$app->user->login($user,3600);//空闲有效期为3600，开启自动登录功能需要大于0秒
        }
        return !$user===false;
    }
    public function Logout()
    {
        static::ExecuteLogout();
    }
    public static function ExecuteLogout()
    {
        if(!Yii::$app->user->isGuest) {
            $auth = Yii::$app->authManager;
            $auth->revokeAll(Yii::$app->user->getId());
            Yii::$app->user->logout();

            //须执行，销毁toke，插入注销历史的记录，需要提供一个方法
        }
    }

}